/**
 * @file conn_point.h
 * @brief Інтерфейс класу, що відповідає за обмін інформацією по мережі
 * @author Platon Sobolevskyi
 */

#ifndef CONN_POINT_H
#define CONN_POINT_H

#include <QtCore>
#include <QtWebKit/QtWebKit>
#include <QFileSystemModel>
#include "message.h"
#include "remote_tree_model.h"
#include "common.h"

typedef unsigned char byte_t;

class ConnectionPoint {
/** @brief Клас, що забезпечує обмін інформацією між екземплярами програми на віддалених хостах */
public:
	ConnectionPoint (const QString &mount_point);
	/** @brief Конструктор, що віжповідає за запуск сервера на поточному хості */

	~ConnectionPoint ();

	// Server functions
	void reset_mount_point (const QString &mount_point);

	// Client functions
	RemoteTreeModel* connect (const QString &remote_ip);

	void disconnect ();

	RemoteTreeModel* reconnect (const QString &remote_ip);

	FileInfo* get_remote_file_info (const QString &remote_ip, const QString &rel_path, bool then_disconnect = false);
	/** @brief Клієнтська функція: отримати інформацію про файл на віддаленому хості */

	QByteArray* get_remote_file_contents (const QString &remote_ip, const QString &rel_path, bool then_disconnect = false);
	/** @brief Клієнтська функція: отримати вміст файлу на віддаленому хості у вигляді С-рядка */

	RemoteTreeModel* get_remote_tree_model ();

private:
	static const quint16 PORT_NUMBER = 54345;

	class ServerTask : public QRunnable {
	public:
		ServerTask(QTcpSocket *_client, QSemaphore *_continue_working);
		void reject();
		void run();

		static QFileSystemModel fsm;
	private:		
		QScopedPointer<QTcpSocket> client;
		QSemaphore *continue_working;
	};

	class ServerThread : public QThread {
	public:
		ServerThread();
		void run();
		void stop_server();
	private:

		QTcpServer server;
		QThreadPool workers;
		QList<ServerTask*> waiting_tasks;
		QSemaphore continue_working;
	};

	ServerThread st;
	QScopedPointer<QTcpSocket> server; // to be used by client functions
};

void conn_point_test0 ();

#endif // CONN_POINT_h
